#include "estructuras_generales.h"
#include "log.h"
#include <time.h>
#include <unistd.h>
#include <stdlib.h>
#include <string.h>
#include <stdio.h>
#include <signal.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <sys/select.h>
#include <unistd.h>
#include <netinet/in.h>
#define TAMANIO_SECTOR 512
#define OFFSET 14

void serializeNIPC(char*resultado,char type,int32_t payloadLength,char *payload,int32_t numeroSector,char cifraSector) {
		//resultado = calloc(1,sizeof(struct nipc_protocol)+payloadLength);
		char numeroSectorFinal[9];
		memset(numeroSectorFinal,'\0',9);
			if(cifraSector=='1'){
				sprintf(numeroSectorFinal,"0000000%d",numeroSector);
			}else if(cifraSector=='2'){
				sprintf(numeroSectorFinal,"000000%d",numeroSector);
			}else if(cifraSector=='3'){
				sprintf(numeroSectorFinal,"00000%d",numeroSector);
			}else if(cifraSector=='4'){
				sprintf(numeroSectorFinal,"0000%d",numeroSector);
			}else if(cifraSector=='5'){
				sprintf(numeroSectorFinal,"000%d",numeroSector);
			}else if(cifraSector=='6'){
				sprintf(numeroSectorFinal,"00%d",numeroSector);
			}else if(cifraSector=='7'){
				sprintf(numeroSectorFinal,"0%d",numeroSector);
			}else if(cifraSector=='8'){
				sprintf(numeroSectorFinal,"%d",numeroSector);
			}


			resultado[0]=type;

			memcpy(resultado+1,"512",3);
			resultado[4]=cifraSector;
			memcpy(resultado+5,payload,payloadLength);
			memcpy(resultado+517,numeroSectorFinal,9);


/*
				sprintf(resultado,"%c%d%c",type,payloadLength,cifraSector);

				for(i=0;i<(payloadLength);i++){
					resultado[i+5]=payload[i];
				}
				sprintf(resultado+(512+5),"%d",numeroSector);


*/


}
void deserealizarNIPC(char*resultado,struct nipc_protocol *punteroEstructuraNIPC) {

	int32_t i;
	char auxiliarTamanio[4];
	char auxiliarPayload[513];
	memset(auxiliarTamanio,'\0',4);
	memset(auxiliarPayload,'\0',513);
	int32_t cantPosTypeLengthYCifra=5;
//	char*punteroCifraSector=resultado+4;
	//int32_t cifraSector=cifraSector_devolverInt(resultado[4]);//punteroCifraSector[4]-48;

	char sector[10];
	memset(sector,'\0',9);
	punteroEstructuraNIPC->type=resultado[0];
	punteroEstructuraNIPC->cifraSector=resultado[4];
	auxiliarTamanio[0]=resultado[1];

	auxiliarTamanio[1]=resultado[2];
	auxiliarTamanio[2]=resultado[3];



	if(memcmp(auxiliarTamanio,"000",strlen("000"))==0){
		punteroEstructuraNIPC->payloadLength=0;
	}else{
		punteroEstructuraNIPC->payloadLength=atoi(auxiliarTamanio);
	}


	sprintf(sector,"%c%c%c%c%c%c%c%c%c",resultado[517],resultado[518],resultado[519],resultado[520],resultado[521],resultado[522],resultado[523],resultado[524],resultado[525]);

	punteroEstructuraNIPC->numeroSector=atoi(sector);

	if (punteroEstructuraNIPC->payloadLength==0){
		memcpy(punteroEstructuraNIPC->payload,"",strlen(auxiliarPayload));
	}else{
		for(i=cantPosTypeLengthYCifra;i<((punteroEstructuraNIPC->payloadLength)+cantPosTypeLengthYCifra);i++){
			punteroEstructuraNIPC->payload[i-cantPosTypeLengthYCifra]=resultado[i];
		}
		//memcpy((*punteroEstructuraNIPC)->payload,auxiliarPayload,(*punteroEstructuraNIPC)->payloadLength);
	}

}
int32_t cifraSector_devolverInt(char cifraEnChar){
	if(cifraEnChar=='0') return 0;
	if(cifraEnChar=='1') return 1;
	if(cifraEnChar=='2') return 2;
	if(cifraEnChar=='3') return 3;
	if(cifraEnChar=='4') return 4;
	if(cifraEnChar=='5') return 5;
	if(cifraEnChar=='6') return 6;
	if(cifraEnChar=='7') return 7;
	if(cifraEnChar=='8') return 8;
	if(cifraEnChar=='9') return 9;
}


char sector_darCifra(int32_t numeroSector){
	if((numeroSector>=0)&&(numeroSector<10)){
		return '1';
	}else if((numeroSector>=10)&&(numeroSector<100)){
		return '2';
	}else if((numeroSector>=100)&&(numeroSector<1000)){
		return '3';
	}else if((numeroSector>=1000)&&(numeroSector<10000)){
		return '4';
	}else if((numeroSector>=10000)&&(numeroSector<100000)){
		return '5';
	}else if((numeroSector>=100000)&&(numeroSector<1000000)){
		return '6';
	}else if((numeroSector>=1000000)&&(numeroSector<10000000)){
		return '7';
	}else if((numeroSector>=10000000)&&(numeroSector<100000000)){
		return '8';
	}else if((numeroSector>=100000000)&&(numeroSector<1000000000)){
		return '9';
	}
}
void NIPC_enviar(int32_t descriptorSocket,char type,int32_t payloadLength,char *payload,int32_t numeroSector){
	int32_t tamanoMaximo=1/*type*/+3/*lenght*/+1/*cifra Sector*/+512/*payload*/+9/*cifra maxima*/;
	char resultado[tamanoMaximo];
	memset(resultado,'\0',tamanoMaximo);
	serializeNIPC(resultado,type,payloadLength,payload,numeroSector,sector_darCifra(numeroSector));
	send(descriptorSocket,resultado,tamanoMaximo,0);


}
void NIPC_recibir(int32_t *descriptorSocket, struct nipc_protocol *punteroNIPC){

	int32_t tamanoMaximo=1/*type*/+3/*lenght*/+1/*cifra Sector*/+512/*payload*/+9/*cifra maxima*/;
	char recibido[tamanoMaximo];
	//recibido=calloc(1,tamanoMaximo);
	memset(recibido,'\0',tamanoMaximo);

    if(recv(*descriptorSocket,&recibido,tamanoMaximo,MSG_WAITALL)<=0){//MSG_waitall
//		close(*descriptorSocket);
		*descriptorSocket = -1;
		return;
    }



	//(*punteroNIPC)=calloc(1,sizeof(struct nipc_protocol));
    memset(punteroNIPC->payload,'\0',512);
	deserealizarNIPC(recibido,punteroNIPC);

}
